package editorsvg.editor.formas;

import editorsvg.propiedades.GrupoPropiedades;
import editorsvg.propiedades.PropiedadNumericaReal;
import java.awt.Shape;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RectangularShape;
import java.awt.geom.RoundRectangle2D;

/**
 * Forma que representa un rectangulo.
 * @author Jorge Berjano
 */
public class Rectangulo extends Forma {

    private Double x;
    private Double y;
    private Double ancho;
    private Double alto;
    private Rectangle2D rectNormal = new Rectangle2D.Double();
    private RoundRectangle2D rectRedondeado = new RoundRectangle2D.Double();
    private RectangularShape rect = rectNormal;
    private Double rx;
    private Double ry;
    private GrupoPropiedades propiedadesForma;

    @Override
    public String getNombreTag() {
        return "rect";
    }

    @Override
    public Shape getShape() {
        return rect;
    }
    
    @Override
    public Object clone() throws CloneNotSupportedException {
        Rectangulo clon = (Rectangulo) super.clone();
        clon.propiedadesForma = (GrupoPropiedades) propiedadesForma.clone();
        clon.propiedadesForma.asignarObjeto(this);
        return clon;
    }

    @Override
    public void actualizar() {
        if (x == null || y == null || ancho == null || alto == null) {
            return;
        }
        if (rx == null && ry == null) {
            rectNormal.setRect(x, y, ancho, alto);
            rect = rectNormal;
        } else {
            rectRedondeado.setRoundRect(x, y, ancho, alto,
                    2 * (rx == null ? ry : rx), 2 * (ry == null ? rx : ry));
            rect = rectRedondeado;
        }
    }

    @Override
    public GrupoPropiedades obtenerPropiedades() {
        if (propiedadesForma == null) {
            propiedadesForma = new GrupoPropiedades("Rectangulo");
            propiedadesForma.agregarPropiedad(new PropiedadNumericaReal(this, "x"));
            propiedadesForma.agregarPropiedad(new PropiedadNumericaReal(this, "y"));
            propiedadesForma.agregarPropiedad(new PropiedadNumericaReal(this, "ancho", "width"));
            propiedadesForma.agregarPropiedad(new PropiedadNumericaReal(this, "alto", "height"));
            propiedadesForma.agregarPropiedad(new PropiedadNumericaReal(this, "rx"));
            propiedadesForma.agregarPropiedad(new PropiedadNumericaReal(this, "ry"));
        }

        return propiedadesForma;
    }

    public void setPosicion(Point2D centro) {
        setX(centro.getX());
        setY(centro.getY());
    }

    public Point2D getCentro() {
        return new Point2D.Double(x, y);
    }

    public Double getX() {
        return x;
    }

    public void setX(Double x) {
        this.x = x;
    }

    public Double getY() {
        return y;
    }

    public void setY(Double y) {
        this.y = y;
    }

    public Double getAncho() {
        return ancho;
    }

    public void setAncho(Double ancho) {
        if (!ancho.equals(this.ancho)) {
            actualizar();
        }
        this.ancho = ancho;
    }

    public Double getAlto() {
        return alto;
    }

    public void setAlto(Double alto) {
        this.alto = alto;
    }

    public Double getRx() {
        return rx;
    }

    public void setRx(Double rx) {
        this.rx = rx;
    }

    public Double getRy() {
        return ry;
    }

    public void setRy(Double ry) {
        this.ry = ry;
    }
}
